/**
 * 字符串工具函数
 */

/**
 * 截取字符串并添加省略号
 * @param str 原始字符串
 * @param maxLength 最大长度
 * @returns 处理后的字符串
 */
export const truncate = (str: string, maxLength: number): string => {
    if (!str) return ''
    if (str.length <= maxLength) return str
    return str.substring(0, maxLength) + '...'
}

/**
 * 格式化金额
 * @param amount 金额数值
 * @param decimals 小数位数，默认2位
 * @param decimalSeparator 小数点分隔符，默认'.'
 * @param thousandsSeparator 千分位分隔符，默认','
 * @returns 格式化后的金额字符串
 */
export const formatCurrency = (
    amount: number,
    decimals = 2,
    decimalSeparator = '.',
    thousandsSeparator = ','
): string => {
    if (isNaN(amount)) return '0.00'

    const fixedAmount = amount.toFixed(decimals)
    const [integerPart, decimalPart] = fixedAmount.split('.')

    // 添加千分位分隔符
    const formattedIntegerPart = integerPart.replace(/\B(?=(\d{3})+(?!\d))/g, thousandsSeparator)

    return decimalPart ? `${formattedIntegerPart}${decimalSeparator}${decimalPart}` : formattedIntegerPart
}

/**
 * 生成指定长度的随机字符串
 * @param length 字符串长度，默认16
 * @param chars 可选字符集，默认包含字母和数字
 * @returns 随机字符串
 */
export const randomString = (
    length = 16,
    chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
): string => {
    let result = ''
    const charsLength = chars.length

    for (let i = 0; i < length; i++) {
        result += chars.charAt(Math.floor(Math.random() * charsLength))
    }

    return result
}

/**
 * 转换为驼峰命名
 * @param str 原始字符串，可以是下划线或连字符格式
 * @returns 驼峰命名格式的字符串
 */
export const toCamelCase = (str: string): string => {
    return str.replace(/[-_]+(\w)/g, (_, c) => c.toUpperCase()).replace(/^\w/, c => c.toLowerCase())
}

/**
 * 转换为帕斯卡命名（首字母大写的驼峰命名）
 * @param str 原始字符串
 * @returns 帕斯卡命名格式的字符串
 */
export const toPascalCase = (str: string): string => {
    const camelCase = toCamelCase(str)
    return camelCase.charAt(0).toUpperCase() + camelCase.slice(1)
}
